﻿using System;

namespace 策略模式
{
    class Program
    {
        static void Main(string[] args)
        {

            #region 抽象实现
            Context context;
            context = new Context(new ComA());
            context.absContextInterface();
            context = new Context(new ComB());
            context.absContextInterface();
            context = new Context(new ComC());
            context.absContextInterface();
            #endregion

            #region 接口实现
            IContext context1;
            context1= new IContext(new ComA());
            context1.ContextInterface();
            context1 = new IContext(new ComB());
            context1.ContextInterface();
            context1 = new IContext(new ComC());
            context1.ContextInterface();
            #endregion


            /*
             * 策略模式：
             * 
             * 封装类型规则，不同时间应用不同的规则可以采用策略模式
             * 
             * 策略模式是定义一系列算法的方法，从本质上看他们完成的都是相同的工作,
             * 只是彼此的实现方式不同，它可以以相同的方式调用所有算法，减少了所以算法类和使用算法类之间的耦合(DPE)
             * 只是他们的实现不同，它可以以相同的方式调用所有算法，从而减少了个类算法类与使用算法类之间的耦合这个在哪里可以体现出来呢？
             * 在工厂模式中如果要调用不同的实现方法就必须声明一系列的抽象类或接口然后直接使用
             * 而在策略模式中通过使用上下文（中间商）的方式降低的使用类和被使用类直接的耦合，使用类只和上下文耦合，通过上下文去联系被使用类。
             * 
             * 策略模式和工厂模式及其相似，唯一不同的就是策略模式采用中间商的方式去实现，
             * 从而降低的他们的耦合性。
             * 
             * 
             * 上会说到小B 历经千辛万苦终于将那条产线巴拉改造成易扩展的产线之后，每每变动生产需求都要亲自和小D交接
             * 都说懒才是第一生产力，这句话一点也没错，于是小B 就想了我每次变动生产需求都要去和小D 亲自交接一下，有没有什么办法简化一下这个流程呢
             * 当然有呀，于是 小B 和小D 两个人就拉了个企鹅群(Context)，把所以的文档都放到了群里，此后 只要改变了生产需求小B就只要在企鹅群里跟小D 
             * 说一声就行了,就这样小B 在工厂模式的基础上又简化了，正他冥思苦想为这个发现命名时，他发现了桌上的策略三国，于是，
             * 小 B 决定把他发现的行为模式叫做 策略模式......
             * 欲知后事如何且听下回分解。
             * 
             * 
             * 
             */

        }
    }
}
